package com.btks.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;

/**
 * 客户端代码常用套路
 * 1、获取一个客户端对象
 * 2、执行相关操作命令
 * 3、关闭资源
 * @author cheng-qiang
 * @date 2022年10月18日9:58
 */
public class HdfsClient {

    private FileSystem fs;

    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        // 连接的集群nn地址
        URI uri = new URI("hdfs://hadoop1002:8020");
        // 创建一个配置文件
        Configuration configuration = new Configuration();
        // 获取客户端对象
         fs = FileSystem.get(uri, configuration,"atguigu");
    }

    @After
    public void close() throws IOException {
        // 关闭资源
        fs.close();
    }

    @Test
    public void testMkdir() throws IOException {
        // 创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huaguoshan"));
    }

    @Test
    public void testPut() throws IOException {
        // 参数解读：参数1表示删除原数据；参数2表示是否允许覆盖；参数三原数据路径；参数4目的地路径
        fs.copyFromLocalFile(false,true,new Path("D:\\1.png"),new Path("/xiyou/huaguoshan"));
    }

    @Test
    public void testGet() throws IOException {
        // 参数解读：参数1表示源文件是否删除；参数2表示源文件路径；参数三目的地路径；参数4是否开启本地校验
        fs.copyToLocalFile(false,new Path("/xiyou/huaguoshan"),new Path("D:\\"),true);
    }

    @Test
    public void testRm() throws IOException {
        // 参数解读：参数1删除路径、参数2是否递归删除
        fs.delete(new Path("/xiyou/huaguoshan"),true);
    }

    @Test
    public void testMv() throws IOException {
        // 参数解读：参数1源文件路径；参数2目标文件路径
        fs.rename(new Path("/xiyou/huaguoshan/1.png"),new Path("/xiyou/huaguoshan/IdCard.png"));
    }

    @Test
    public void testDetail() throws IOException {
        // 文件详情查看
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()){
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("************************************"+fileStatus.getPath()+"************************************");
            System.out.println(fileStatus.getPermission());
            System.out.println(fileStatus.getGroup());
            System.out.println(fileStatus.getLen());
            System.out.println(fileStatus.getModificationTime());
            System.out.println(fileStatus.getBlockSize());
            System.out.println(fileStatus.getReplication());
            System.out.println(fileStatus.getPath().getName());
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
        }
    }

    @Test
    public void testFile() throws IOException {
        // 文件目录判断
        FileStatus[] fileStatuses = fs.listStatus(new Path("/xiyou/huaguoshan"));
        for (FileStatus fileStatus : fileStatuses) {
            if(fileStatus.isFile()){
                System.out.println("文件："+fileStatus.getPath().getName());
            }else {
                System.out.println("目录："+fileStatus.getPath().getName());
            }
        }
    }

}
